
(() => {
  // 函数声明: 命名函数
  function add(x, y) {
    return x + y
  }

  // 函数表达式: 匿名函数
  let myAdd = function(x, y) { 
    return x + y;
  }

  console.log(myAdd(2, 3))


  // 完整写法 ===> 有些多余
  let myAdd2: (x: number, y: number) => number = function(x: number, y: number): number { 
    return x + y;
  }
  console.log(myAdd2(2, 3))

  function buildName(firstName: string='A', lastName?: string): string {
    if (lastName) {
      return firstName + '-' + lastName
    } else {
      return firstName
    }
  }

  console.log(buildName())
  console.log(buildName('A', 'B'))

  function info(x: string, ...args: string[]) {
    console.log(x, args)
  }
  info('abc', 'c', 'b', 'a')

})()

;(() => {
   /* 
  函数重载: 函数名相同, 而形参不同的多个函数
  需求: 我们有一个add函数，它可以接收2个string类型的参数进行拼接，也可以接收2个number类型的参数进行相加 
  */

  // 重载函数声明 ==> 对函数进行更严格的说明
  function add(p1: string, p2: string)
  function add(p1: number, p2: number)

  function add (p1: string|number, p2: string|number) {
    if (typeof p1==='string' && typeof p2==='string') {
      return p1 + p2
    } else if (typeof p1==='number' && typeof p2==='number') {
      return p1 + '' + p2
    } else {
      throw new Error('参数有错!')
    }
  }

  console.log(add('ab', 'cd'), add(12, 34))
  // console.log(add('ab', 12))
})()